﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//11.为了可读性，可读性要比效率更重要；
//void printAarryOne(int* arr, int len)
void printAarryOne(int arr[], int len)
{
	for (int i = 0; i < len; ++i)
	{
		printf("9.输出arr[i]为：%d\n", arr[i]);//1，...，5
		printf("10.输出*(arr+i)为：%d\n", *(arr + i));//1，...，5
	}
}
void testOneDimensionArray()
{
	//1.两种情况下，数组名不是指向首元素的指针，是数组类型；数组指针类型；
	int arr[] = { 1,2,3,4,5 };
	//2.第一种，sizeof。如果是指针，下面的值就是4了。然而，并不是；
	printf("3.输出sizof arr的值：%d\n", sizeof arr);//20
	//4.第二种，对数组名arr取地址；&arr，&arr+1的结果是，arr的步长为20个字节，刚好是一个数组的长度。如果是指针
		//的话，那步长就是4个字节；
	printf("5.输出数组arr的首地址：%d\n", &arr);//13956776
	printf("6.对&arr+1，得到结果：%d\n", &arr + 1);//13956796

	//7.除了上面两种情况之外，数组名在其他任何情况下都是指向首元素的指针；
	int* p = arr;

	//8.数组名是一个常量指针；下面式子直接报错。
	//arr = NULL;

	printAarryOne(arr, 5);

	//12.数组的下标可以为负数；
	p += 3;//arr[3]
	printf("13.输出p[-1]的值：%d\n", p[-1]);//3		     arr[2]
	printf("14.输出*(p-1)的值：%d\n", *(p - 1));//3		 arr[2]

	//15.数组指针类型arr，步长为20；数组首元素指针类型；
	//16.定义一个可以指向数组的指针；先定义数组类型，再定义数组指针类型；
	typedef int(ARRAY_TYPE)[5];//typedef unsigned int u32
	ARRAY_TYPE myArray;//int myArray[5];

	for (int i = 0; i < 5; ++i)
	{
		myArray[i] = 100 + i;
	}
	for (int i = 0; i < 5; ++i)
	{
		printf("17.输出自定义的数组类型变量myArray[i]的值：%d\n", myArray[i]);//100，...，104
	}

	//18.定义数组类型指针；对数组名取地址，代表指向整个数组的指针；
	ARRAY_TYPE* pArray = &myArray;
	pArray = &arr;

	//19.*pArray表示获取到pArray指针指向的整个数组；
	//20.*pArray类型就是数组名，指向首元素类型的指针；
	printf("21.输出数组指针类型pArray指向数组arr，获得*(*pArray+1)的值：%d\n", *(*pArray + 1));//2  arr[1]

	//22.直接定义数组指针类型；
	typedef int(*ARRAY_POINTER)[5];
	ARRAY_POINTER pArr = &arr;

	//23.直接定义数组指针变量；
	int(*pArrayParam)[5] = &arr;
}

//main202：一维数组和数组指针类型
int main202()
{
	testOneDimensionArray();

	system("pause");
	return EXIT_SUCCESS;
}